//给定一个已排序的链表的头
// head ， 删除所有重复的元素，使每个元素只出现一次 。返回 已排序的链表 。 
//
// 
//
// 示例 1： 
// 
// 
//输入：head = [1,1,2]
//输出：[1,2]
// 
//
// 示例 2： 
// 
// 
//输入：head = [1,1,2,3,3]
//输出：[1,2,3]
// 
//
// 
//
// 提示： 
//
// 
// 链表中节点数目在范围 [0, 300] 内 
// -100 <= Node.val <= 100 
// 题目数据保证链表已经按升序 排列 
// 
//
// Related Topics 链表 👍 1223 👎 0


//leetcode submit region begin(Prohibit modification and deletion)


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        //1.边界条件
//        //节点数小于2
//        if(head == null || head.next == null){
//            return head;
//        }
//        //节点数大于等于2
//        ListNode p1 = head;
//        ListNode p2;
//        while((p2 = p1.next) != null){//p2始终指向p1的下一个节点
//            if(p1.val == p2.val){
//                //删除p2（while循环中有p2的赋值，所以不需要再操作p2)
//                p1.next = p2.next;
//            }else{
//                //向后平移一个位置
//                p1 = p1.next;
//            }
//        }
//        return head;
        //2. 使用递归
        //head要么为空，要么是原函数的头(假如前两个一样，则返回第二个节点作为头结点）。递归函数的head
        if(head == null || head.next == null){
            return head;
        }
        if(head.val == head.next.val){
            return deleteDuplicates(head.next);//使用下一个节点作为头结点，意思是删除头节点使用和头节点值一样的下一个节点作为头结点。
        }else{
            head.next = deleteDuplicates(head.next);//还是使用当前节点作为头结点，但是执行的是以当前头节点下个节点作为头结点的函数。
            return head;
        }
    }
}
//leetcode submit region end(Prohibit modification and deletion)
